.TITLE TTTBL .IDENT /07.00/ ; ; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ; ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; ; 08-MAY-78 PETER WANNHEDEN ; ; PREVIOUSLY MODIFIED BY: ; ; C. F. SPITZ ; D. R. DONCHIN ; T. LEKAS ; S. C. ADAMS ; K. L. FELDMANN ; ; MODIFICATIONS: ; ; ; MODIFIED FOR RSX-11M-PLUS V4.3 BY: ; ; L. KOGAN 5-OCT-89 07.00 ; LK750 -- CLEAR THE NUMBER OF BYTES IN CURRENT OUTPUT BUFFER ; (U.TOC) ; .PSECT MAP5 ; ;+ ; THIS MODULE CONTAINS THE DRIVER DISPATCH TABLE. ; IN A SYSTEM THAT SUPPORTS KERNEL DATA SPACE, THIS MODULE MUST ; BE BUILT INTO THE TASK IMAGE "TTDRV". ; THIS IS IN CONTRAST TO ALL OTHER DRIVER DATA, WHICH IS CONTAINED ; IN THE MODULE "TTDAT" AND IS BUILT INTO THE TASK IMAGE "TTCOM". ;- ; ; ; DRIVER DISPATCH TABLE ; .IF DF B$$MAP .IIF NDF,T$$SPC,.ERROR ;ASSUME THAT THERE IS NO SECONDARY ;POOL BUFFERS FOR BITMAP SYSTEMS. ;FOR NOW THERE IS NO SUPPORT FOR ;I/D SPACE BITMAP SYSTEMS .WORD R$OUTD ;OUTPUT COMPLETION ROUTINE FOR CT .WORD G$IN ;INPUT ROUTINE FOR CT .ENDC ;B$$MAP .IF DF T$$SPC .WORD NXTCMD ;ROUTINE TO PROCESS THE NEXT CLI COMMAND .ENDC ;T$$SPC .WORD DELTB0 ;ROUTINE TO DEALLOCATE BUFFERS $TTTBL::.WORD TTINI ;REQUEST INITIATOR .WORD TTCAN ;CANCEL I/O .WORD $NLTMO ;TIME-OUT - USE SPECIAL NULL TIME-OUT ROUTINE .IF DF R$$CON .WORD TTPWFL ;POWERFAIL ENTRY POINT .WORD TTKRB ;KRB STATUS CHANGE ENTRY POINT .WORD TTUCB ;UCB STATUS CHANGE ENTRY POINT .IFF .WORD TTPWUP ;POWER-UP .IF DF B$$MAP .WORD FORVMR,FORVMR ;VMR REQUIRES THAT THESE WORDS ;BE HERE AND THAT THEY POINT TO ;TO AN ADDRESS IN THE DRIVER. ;THIS IS BECAUSE VMR DOES NOT ;BELIEVE IN M-PLUS SYSTEMS ;WITHOUT RECONFIGURATION SUPPORT .ENDC ;B$$MAP .ENDC .IF DF R$$MPL .IIF DF B$$MAP .IRP X, .IIF NDF B$$MAP .IRP X, .IF IDN X,LH .IF DF T$$LTH .ASCII /LH/ .WORD $LHDEV .WORD 0 LHCTBP::.WORD 0 .ENDC ; T$$LTH .ENDC ; IDN X,LH .IF IDN X,US .IF DF T$$USP .ASCII /US/ .WORD $USINP .WORD $USOUT .WORD 0 USCTBP::.WORD 0 .ENDC ; T$$USP .ENDC ; IDN X,US .IF DIF X,LH .IF DIF X,US .IF DF D$$'X'11 .ASCII /Y'X'/ .IF IDN X,M .WORD $DM11B .IFF .WORD $Y'X'INP .WORD $Y'X'OUT .ENDC .WORD 0 .IF IDN X,M .IF NDF T$$COM YMCP1:: .ENDC ;NDF T$$COM .ENDC ;IDN X,M Y'X'CTBP::.WORD 0 .ENDC .ENDC ; DIF X,US .ENDC ; DIF X,LH .ENDR $TTTBE::.WORD 0 ;END OF TABLE ; ; .IF DF T$$COM ; POINTER TO PCB FOR COMMON BLOCK "TTCOM" ; $TTCOM::.BLKW 1 ;TO BE FILLED IN BY VMR ;CLEARED BY DRIVER INITIALIZATION ROUTINE .ENDC ;T$$COM .IFF ;R$$MPL $NLTMO::CLR S$$SPC+2(SP) ;FORCE $SCDVT ON TO NEXT DCB INCB S.CTM(R4) ;RESET TIMEOUT COUNT FOR THE NEXT TIME RETURN ; .ENDC ;R$$MPL .IF DF R$$CON TTPWFL::MOV KINAR6,-(SP) ;SAVE KERNEL INSTRUCTION APR 6 BCC 20$ ;BRANCH ON UNIT POWERFAIL MOV #CT.CPW,R4 ;GET CONTROLLER POWERFAIL OFFSET CODE BR TTDSP ;GO TO COMMON CONTROLLER DISPATCHER 20$: ADD #U.TSTA,R5 ;POINT TO UCB STATUS TRIPLE-WORD .IF DF T$$ACD TST U.ACB-U.TSTA(R5) ;DOES THIS TERMINAL HAVE AN ACD? BEQ 30$ ;N - JUMP MOV #A.POWE,R0 ;SET POWERFAIL ENTRY POINT CALL $SWACD ;CALL ACD .ENDC ;T$$ACD 30$: MOV #CT.UPW,R2 ;GET UNIT POWERFAIL OFFSET CODE BR TTCRD ;GO TO UNIT DEPENDENT ROUTINE TTKRB:: MOV KINAR6,-(SP) ;SAVE KERNEL INSTRUCTION APR 6 BCS 20$ ;BRANCH IF CONTROLLER OFFLINE .IF DF T$$COM TST $TTCOM ;GET TTCOM PCB ADDRESS BEQ 10$ ;ALREADY INITIALIZED - JUMP .IFF ;T$$COM TST $DALED ;GET KISAR6 MAPPING BNE 10$ ;ALREADY INITIALIZED - JUMP .ENDC ;T$$COM MOV R2,-(SP) ;SAVE R2 CALL TTINIT ;INITIALIZE THE WORLD MOV (SP)+,R2 ;RESTORE R2 10$: MOV #CT.CON,R4 ;GET CONTROLLER ONLINE OFFSET CODE BR TTDSP ;GO TO COMMON CONTROLLER DISPATCHER 20$: MOV #CT.COF,R4 ;GET CONTROLLER OFFLINE OFFSET CODE BR TTDSP ;GO TO COMMON CONTROLLER DISPATCHER TTUCB:: MOV KINAR6,-(SP) ;SAVE KERNEL INSTRUCTION APR 6 BCS 10$ ;BRANCH IF WANT TO SET UNIT OFFLINE ADD #U.TSTA,R5 ;POINT TO UCB STATUS TRIPLEWORD CALL MAPD ;MAP DATA AREA .IF DF T$$SPL CALL ALUCBX ;ALLOCATE A UCBX FOR THIS UCB BCS TTRET1 ;RETURN WITH CC-C SET IF FAILURE .IFF ;T$$SPL CALL CKTAB ;ALLOCATE TYPE-AHEAD BUFFER IF NECESSARY .IFTF ;T$$SPL .IF DF T$$MOD BICB #US.CRW!US.DSB,U.STS-U.TSTA(R5) ;ASSUME LOCAL LINE .ENDC MOV #CT.UON,R2 ;SET ROUTINE INDEX FOR UNIT ONLINE BR TTCRD ;GO TO UNIT DEPENDENT ROUTINE DISPATCHER 10$: CLRB U.TMTI(R5) ;PREVENT MODEM TIMEOUT FROM OCCURRING ADD #U.TSTA,R5 ;ADVANCE UCB POINTER MOV #CT.UOF,R2 ;SET ROUTINE INDEX FOR UNIT OFFLINE MOV KISAR6,-(SP) ;SAVE CURRNT APR 6 MAPPING CALL MAPD ;MAP DRIVER DATA AREA CALL CTRD ;CALL UNIT DEPENDENT ROUTINE .IFT ;T$$SPL TSTB $SCERR ;CHECK FOR ERROR IN UNIT DEPENDENT ROUTINE BMI TTRET ;IF MI, ERROR - DON'T DEALLOCATE UCBX CALL DEUCBX ;DEALLOCATE THE UCBX AND TABUF .IFTF ;T$$SPL BR TTRET ;GO TO COMMON RETURN CODE TTDSP: MOV KISAR6,-(SP) ;SAVE CURRENT APR 6 MAPPING CALL MAPD ;MAP DRIVER DATA AREA MOV @R2,R3 ;GET CSR MOVB K.PRM(R2),R1 ;GET CONTROLLER TYPE ADD CTBL(R1),R4 ;GET DISPATCH TABLE POINTER CALL @(R4)+ ;CALL CONTROLLER DEPENDENT ROUTINE BR TTRET ;GO TO COMMON RETURN CODE TTCRD: MOV KISAR6,-(SP) ;SAVE CURRENT APR 6 MAPPING CALL MAPD ;MAP DRIVER DATA AREA CALL CTRD ;CALL UNIT DEPENDENT ROUTINE TTRET: MOV (SP)+,KISAR6 ;RESTORE ENTRY APR 6 MAPPING TTRET1: MOV (SP)+,KINAR6 ;RESTORE KERNEL INSTRUCTION APR 6 RETURN .IFT ;T$$SPL .ENABL LSB ; ;+ ; ; ALUCBX - ALLOCATE A UCB EXTENSION (UCBX) AND TYPEAHEAD BUFFER (TABUF) ; STUCBX - SET UP A UCB EXTENSION AND TYPEAHEAD BUFFER ; ; INPUT: ; R0 APR BIAS OF 1ST SECONDARY POOL BLOCK (IF ENTRY AT STUCBX) ; R5 POINTER TO U.TSTA ; ; OUTPUT: ; IF SUCCESS: ; CC-C 0 ; UCBX AND CONTIGUOUS TABUF ALLOCATED FROM SECONDARY POOL AND INITIALIZED ; ; IF FAILURE: ; CC-C 1 ; IE.ALC RETURNED IN $SCERR TO INDICATE FAILURE TO BRING TERMINAL ONLINE ; ;- ; ALUCBX: CALL 20$ ;GET NUMBER OF SECONDARY POOL NODES REQUIRED CALL $ALSEC ;ALLOCATE THEM FOR USE BY THIS TERMINAL BCS 10$ ;BRANCH ON ALLOCATION FAILURE STUCBX::MOV R0,U.TAPR-U.TSTA(R5) ;THESE NODES BECOME THE UCBX AND TABUF MOV R0,@#KDSAR5 ;MAP THE UCBX AND TABUF MOV #120000,R4 ;SET THEIR VIRTUAL ADDRESS ASSUME U.TCI,0 CLR @R4 ;NO CURRENT INPUT REQUEST CLR U.TCO(R4) ;NO CURRENT OUTPUT REQUEST CLR U.TOC(R4) ;NO REMAINING BYTES IN CURRENT OUTPUT BUFFER CLRB U.TISV(R4) ;INITIALIZE STATE VARIABLE ASSUME U.TITI&1,0 ASSUME U.TOTI,U.TITI+1 CLR U.TITI(R4) ;CLEAR INPUT AND OUTPUT TIMERS CLR U.TFPB(R4) ;CLEAR PROMPT BUF ADDRS/UNSOLICITED INPUT FLAG CLR U.TRTT(R4) ;NO TERMINATOR TABLE .IF DF T$$EIO CLR U.TDIF(R4) ;CLEAR FIRST DEFAULT INPUT BUFFER POINTER .ENDC ;T$$EIO ; .IF DF T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB ADD #U.TAST,R4 ;POINT TO UNSOLICITED INPUT ACB ADDRESS X = U.TAST ;SYMBOL NEEDED FOR ASSUME MACROS .IF DF T$$CCA CLR (R4)+ ;CLEAR ACB POINTER FOR UNSOLICITED INPUT X = X + 2 .ENDC ;T$$CCA .IF DF T$$SCA ASSUME U.TSCA,X X = X + 2 CLR (R4)+ ;CLEAR SWITCH CHARACTER ACB POINTER .ENDC ;T$$SCA .IF DF T$$MHU ASSUME U.TMHA,X X = X + 2 CLR (R4)+ ;CLEAR MODEM HANGUP ACB POINTER .ENDC ;T$$MHU .IF DF T$$ICS ASSUME U.TICA,X X = X + 2 CLR (R4)+ ;CLEAR ICS ACB/TEP POINTER .ENDC ;T$$ICS .IF DF T$$OOB ASSUME U.TOBA,X X = X + 2 CLR (R4)+ ;CLEAR OOB ACB/TEP POINTER .ENDC ;T$$OOB .ENDC ;T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB ASSUME U.TTBF,X CLR (R4)+ ;INITIALIZE HEADER CLRB (R4)+ ;RESET ACTIVE COUNT AND CLEAR CARRY MOVB U.TBSZ-U.TSTA(R5),(R4) ;SET SIZE OF TABUF RETURN 10$: MOVB #IE.ALC,$SCERR ;INDICATE CAUSE OF FAILURE RETURN ;RETURN WITH CARRY SET ; ;+ ; ; DEUCBX - DEALLOCATE THE UCBX AND TABUF ; ; INPUT: ; R5 POINTER TO U.TSTA ; ; OUTPUT: ; UCB EXTENSION AND TYPEAHEAD BUFFER DEALLOCATED ;- ; DEUCBX::MOV U.TAPR-U.TSTA(R5),R0 ;GET ADDRESS OF UCBX AND TABUF CLR U.TAPR-U.TSTA(R5) ;CLEAR POINTER CALL 20$ ;GET THE NUMBER OF BLOCKS TO DEALLOCATE CALLR $DESEC ;DEALLOCATE THE UCBX AND TABUF AND RETURN ; ; CALCULATE THE NUMBER OF SECONDARY POOL BLOCKS REQUIRED TO CONTAIN THE ; UCB EXTENSION AND A TYPEAHEAD BUFFER WHOSE SIZE IS KEPT IN OFFSET U.TBSZ ; 20$: CLR R1 ;PREVENT UNWANTED SIGN EXTEND BISB U.TBSZ-U.TSTA(R5),R1 ;GET THE SIZE OF THE TABUF LESS ITS HEADER ADD #T$$UXL+4+77,R1 ;INCLUDE TABUF HEADER, UCBX, AND ROUND UP ASH #-6,R1 ;CONVERT TO NUMBER OF SEC POOL BLOCKS REQUIRED RETURN ;RETURN WITH RESULT IN R1 .DSABL LSB .ENDC ;T$$SPL .ENDC ;R$$CON .IF DF T$$SER ; ;+ ; ; NXTCMD - PROCESS THE NEXT CLI COMMAND ; ; INPUT: ; R0 UCB ADDRESS ; ; OUTPUT: ; THE COMMAND IN PROGRESS BIT (UM.CMD) IS CLEARED AND AN ATTEMPT IS ; MADE TO PROCESS CHARACTERS FROM THE TYPEAHEAD BUFFER. FOR MULTI- ; PROCESSOR SYSTEMS, IF WE ARE NOT ON THE CORRECT CPU, FORK TO GET ; THERE WITH A NULL FORK REQUEST, SINCE AFTER FORK PROCESSING WE WILL ; TRY TO PROCESS CHARACTERS FROM THE TYPEAHEAD BUFFER ANYWAY ;- ; NXTCMD: CALL MAPD ;MAP THE DRIVER SAVNR ;SAVE R4 AND R5 MOV R0,R5 ;GET THE UCB ADDRESS ADD #U.TSTA,R5 ;POINT TO U.TSTA BIC #UM.CMD,U.MUP-U.TSTA(R5) ;ENABLE CLI COMMAND PROCESSING .IF DF M$$PRO CLR R3 ;SET NULL FORK REQUEST CALL SWCPU ;SWITCH TO THE CORRECT CPU (NO RETURN) ;OR FALL THRU IF ALREADY ON THE RIGHT CPU .ENDC ;M$$PRO CALL LOCKI ;LOCK OUT INTERRUPTS CALLR SERPRO ;;;SERIALLY PROCESS CHARACTERS FROM TABUF .ENDC ;T$$SER .IF DF B$$MAP!R$$PRO NXTCMD:: ;THIS SHOULD NOT BE CALLED FOR ;P/OS SYSTEMS FORVMR: CRASH ;THIS NEEDS TO BE HERE FOR VMR ;THIS IS BECAUSE VMR DOES NOT ;BELIEVE IN M-PLUS SYSTEMS ;WITHOUT RECONFIGURATION SUPPORT .ENDC ;B$$MAP!R$$PRO ; ; .END